package cz.vse.javaee.email;

import java.io.*;
import java.util.Date;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;

/**
 *
 * @author  VERNER Jan
 * @version 16.3.2012
 */
public class EmailBean implements Serializable
{
//== CONSTANTS & FIELDS (STATIC) ===============================================
//== CONSTANTS & FIELDS ========================================================
    
    // správně by zde být nemělo - user není vlastností této beany
    private String user; 
    
    private String to;
    private String subject;
    private String body;
    

//== CONSTRUCTORS (STATIC) =====================================================
//== CONSTRUCTORS AND FACTORY METHODS ==========================================

//== NON-PRIVATE METHODS (STATIC) ==============================================
//== NON-PRIVATE METHODS =======================================================
    
    /**
     * Schválně předáváme mail session jako parametr. Kdybychom měli
     * session uloženu jako hodnotu atributu, musel by kvůli
     * serializovatelnosti být tento atribut transientní. Při aktivaci
     * během migrace by tak bylo komplikované získat session zpět.
     * @param mailSession
     * @throws MessagingException
     */
    public void send(Session mailSession) throws MessagingException
    {
        // Vytvoříme objekt zprávy
        Message message = new MimeMessage(mailSession);

        // Zatím nenastavujeme From, použije se default
        // z konfigurace serveru
        //message.setFrom();
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(to, false));

        // Nastavíme předmět
        message.setSubject(subject);

        // Vložíme text zprávy
        message.setText(body);
        
       // Nastavíme hlavičku indikující mailového klienta
        message.setHeader("X-Mailer", "My Mailer");

        // Nastavíme datum odeslání
        Date timeStamp = new Date();
        message.setSentDate(timeStamp);

        // Odešleme zprávu
        Transport.send(message);
    }
    
    /**
     * Uloží rozepsanou zprávu do souboru. Soubor se jmenuje shodně jako
     * uživatel + .txt
     * @param path cesta, na které se nachází adresář pro soubory
     */
    public void store(String path)
    {
        // složka pro soubory (koncepty)
        final File folder = new File(path);
        
        // create folder if it does not exist
        if (!folder.exists()) {
            folder.mkdir();
        }
        File ouputFile = new File(folder + File.separator + user + ".txt");
        
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(ouputFile);
            
            // ulož rozepsaný email
            writer.println(to);
            writer.println(subject);
            writer.println(body);            
        }
        catch (FileNotFoundException ex) {
            throw new RuntimeException(ex); // should not ever happen
        }
        finally {
            if (writer != null) { // flush and close the writer
                writer.flush();
                writer.close(); 
            }
        } 
    }
    
    /**
     * Obnoví rozepsaný email ze souboru.
     * @param path cesta, na které se nachází adresář pro soubory
     * @param emailBean beana, které bude nastavena dle údajů ze souboru
     * @throws ServletException pokud pro daného uživatele neexistuje soubor
     */
    public void restore(String path, EmailBean emailBean) throws ServletException
    {
        final File folder = new File(path);
        File source = new File(folder + File.separator + user + ".txt");
        
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(source));
            
            // načti rozepsaný email
            emailBean.setTo     (reader.readLine());
            emailBean.setSubject(reader.readLine());
            emailBean.setBody   (reader.readLine());
        }
        catch (FileNotFoundException ex) {
            System.out.println("Nebyl nalezen soubor s ulozenym emailem.");
        } catch (IOException ex) {
            throw new ServletException(ex);
        }
        finally {
            if (reader != null) { // safely close the reader
                try {
                    reader.close();
                } catch (IOException ex) {
                    throw new ServletException(ex);
                }
            }
        }        
    }
    
    
//== GETTERS & SETTERS =========================================================    
    
    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String message) {
        this.body = message;
    }


//== PRIVATE METHODS (STATIC) ==================================================
//== PRIVATE METHODS ===========================================================
        
//== NESTED TYPES ==============================================================

//== MAIN METHOD (TEST) ========================================================

//    /**
//     * @param args the command line arguments
//     */
//    public static void main(String[] args)
//    {
//        
//    }
}
